<?php
/**
 * helper        系统函数
 * @copyright   Copyright(c) 2024-2034
 * @author      tianjie <527707665@qq.com>
 * @link        http://www.tinphp.com/
 * @version     4.1
 **/

use tian\App;
use tian\Request;
use tian\Response;
use tian\Url;
use tian\Log;
use tian\Clear;
use tian\Redis;
use tian\Config;
use tian\Cache;
use tian\Env;
use tian\Lang;

if (!function_exists('input')) {
    /**
     * 获取输入数据 支持默认值和过滤
     * @param string $key 获取的变量名
     * @param mixed $default 默认值
     * @param string $filter 过滤方法
     * @return mixed
     */
    function input(string $key = '', $default = null, string $filter = '')
    {
        if (0 === strpos($key, '?')) {
            $key = substr($key, 1);
            $has = true;
        }
        if ($pos = strpos($key, '.')) {
            // 指定参数来源
            list($method, $key) = explode('.', $key, 2);
            if (!in_array($method, ['get', 'post', 'put', 'param', 'file'])) {
                $key = $method . '.' . $key;
                $method = 'param';
            }
        } else {
            // 默认为自动判断
            $method = 'param';
        }
        if (isset($has)) {
            return request()->has($key, $method, $default);
        } else {
            return request()->$method($key, $default, $filter);
        }
    }
}

if (!function_exists('request')) {
    /**
     * 获取当前Request对象实例
     * @return Request
     */
    function request(): Request
    {
        return Request::instance();
    }
}

if (!function_exists('redis')) {
    /**
     * 获取当前Request对象实例
     * @return mixed|Redis|null
     */
    function redis()
    {
        $config = config("redis")['default'];
        return Redis::getInstance($config);
    }
}

if (!function_exists('url')) {
    /**
     * Url生成
     * @param string $str 路由地址
     * @param string|array $ary 变量
     * @return string
     */
    function url(string $str = '', array $ary = []): string
    {
        return Url::create($str, $ary);
    }
}

if (!function_exists('jsone')) {
    /**
     * @param mixed $data 返回的数据
     * @return string
     */
    function jsone($data = []): string
    {
        header('Content-Type: text/html; charset=utf-8');
        header("Access-Control-Allow-Origin:*"); // 允许任意域名发起的跨域请求
        header('Access-Control-Allow-Headers:DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Typ');
        header('Access-Control-Allow-Methods:PUT,POST,GET,DELETE,OPTIONS');

        echo json_encode($data, JSON_UNESCAPED_UNICODE);
        exit;
    }
}

if (!function_exists('response')) {
    /**
     * 创建普通 Response 对象实例
     * @param mixed $data 输出数据
     * @param int|string $code 状态码
     * @param array $header 头信息
     * @param string $type
     * @return Response
     */
    function response($data = [], $code = 200, $header = [], $type = 'html')
    {
        return Response::create($data, $type, $code, $header);
    }
}

if (!function_exists('json')) {
    /**
     * 获取\tian\response\Json对象实例
     * @param mixed $data 返回的数据
     * @param integer $code 状态码
     * @param array $header 头部
     * @param array $options 参数
     * @return Response|\tian\response\Json
     */
    function json($data = [], int $code = 200, array $header = [], array $options = [])
    {
        return Response::create($data, 'json', $code, $header, $options);
    }
}

if (!function_exists('jsonp')) {
    /**
     * 获取\tian\response\Jsonp对象实例
     *
     * @return \tian\response\Jsonp
     */
    /**
     * 获取\tian\response\Jsonp对象实例
     * @param mixed $data 返回的数据
     * @param integer $code 状态码
     * @param array $header 头部
     * @param array $options 参数
     * @return Response|\tian\response\Json
     */
    function jsonp($data = [], $code = 200, $header = [], $options = [])
    {
        return Response::create($data, 'jsonp', $code, $header, $options);
    }
}

if (!function_exists('setLog')) {
    /**
     * 日志记录
     * @param string $content 日志内容
     * @param string $type 日志类型
     * @return void
     */
    function setLog(string $content, string $type = 'log')
    {
        Log::write($content, $type);
    }
}

if (!function_exists('clear')) {
    /**
     * 助手函数 清除缓存
     * @param string $type 类型 cache|log|views
     * @return void
     */
    function clear(string $type = 'all')
    {
        Clear::del($type);
    }
}

if (!function_exists('fileRoutePatch')) {
    /**
     * 文件路径补全
     * @param string $name
     * @return string
     */
    function fileRoutePatch(string $name): string
    {
        $epr = '/';
        $name = ltrim($name, $epr);
        $name = rtrim($name, $epr);
        $strAry = explode($epr, $name);
        $strAryNum = count($strAry);

        if ($strAryNum == 1) {
            $intactFile = request()->module() . $epr . request()->controller() . $epr . $name;
        } elseif ($strAryNum == 2) {
            $intactFile = request()->module() . $epr . $name;
        } else {
            $intactFile = $name;
        }
        return $intactFile;
    }
}

if (!function_exists('model')) {
    /**
     * 助手函数 实例化Model
     * @param string $name
     * @return mixed|void
     */
    function model(string $name = '')
    {
        try {
            $module = request()->module();
            $class = "\\app\\" . $module . "\\model\\" . $name;
            if (class_exists($class)) {
                $model = new $class();
            } else {
                $class = '\\app\\model\\' . $name;
                if (class_exists($class)) {
                    $model = new $class();
                } else {
                    throw new Exception('class not exists:' . $class);
                }
            }
            return $model;
        } catch (Exception $e) {
            exit($e->getMessage());
        }
    }
}

if (!function_exists('config')) {
    /**
     * 读取配置文件内容
     * @param string $name
     * @return null
     */
    function config(string $name)
    {
        if ($name) {
            return App::getConfig($name);
        }
        return null;
    }
}

if (!function_exists('redirect')) {
    /**
     * 重定向
     * @param string|null $url
     * @return void
     */
    function redirect(string $url = null)
    {
        if ($url == null) {
            $url = '/';
        }
        header('content-type:text/html;charset=uft-8');
        header("Location: $url");
        exit();
    }
}

if (!function_exists('toUnderLineName')) {
    /**
     * 驼峰命名转下划线命名，如 UserName => user_name
     * @param string $s
     * @return string
     */
    function toUnderLineName(string $s): string
    {
        $s = lcfirst($s);
        $chars = str_split($s);
        $res = "";
        foreach ($chars as $c) {
            if (isCapitalLetter($c)) {
                $c = "_" . strtolower($c);
            }
            $res .= $c;
        }
        return $res;
    }
}

if (!function_exists('isCapitalLetter')) {
    /**
     * 判断字符串是否为大写字母
     * @param string $c
     * @return boolean
     */
    function isCapitalLetter(string $c): bool
    {
        if (preg_match('/^[A-Z]+$/', $c)) {
            return true;
        } else {
            return false;
        }
    }
}

if (!function_exists('get_filenamesbydir')) {
    /**
     * 获取目录下所有文件，包括子目录
     * @param string $dir
     * @return array
     */
    function get_filenamesbydir(string $dir): array
    {
        $files = [];
        get_allfiles($dir, $files);
        return $files;
    }
}

if (!function_exists('get_allfiles')) {
    /**
     * @param $path
     * @param $files
     * @return void
     */
    function get_allfiles($path, &$files)
    {
        if (is_dir($path)) {
            $dp = dir($path);
            while ($file = $dp->read()) {
                if ($file !== "." && $file !== "..") {
                    get_allfiles($path . "/" . $file, $files);
                }
            }
            $dp->close();
        }
        if (is_file($path)) {
            $files[] = [
                'path' => $path,
                'name' => trim(strrchr($path, '/'), '/')
            ];
        }
    }
}

if (!function_exists('version')) {
    /**
     * 获取版本
     */
    function version(): string
    {
        return App::version();
    }
}

if (!function_exists('debug')) {
    /**
     * 获取框架运行模式
     * @return bool
     */
    function debug(): bool
    {
        return (new App)->debug();
    }
}

if (!function_exists('setCache')) {
    /**
     * 设置文件缓存
     * @param $key
     * @param $data
     * @return bool
     */
    function setCache($key, $data): bool
    {
        return (new Cache())->set($key, $data);
    }
}

if (!function_exists('getCache')) {
    /**
     * 获取文件缓存
     * @param $key
     * @return mixed|string
     */
    function getCache($key)
    {
        return (new Cache())->get($key);
    }
}

if (!function_exists('delCache')) {
    /**
     * 删除文件缓存
     * @param $key
     * @return bool
     */
    function delCache($key): bool
    {
        return (new Cache())->del($key);
    }
}

if (!function_exists('hasCache')) {
    /**
     * 验证缓存是否存在
     * @param $key
     * @return bool
     */
    function hasCache($key): bool
    {
        return (new Cache())->has($key);
    }
}

if (!function_exists('env')) {
    /**
     * 获取环境变量值
     * @access public
     * @param string $name 环境变量名（支持二级 .号分割）
     * @param string $default 默认值
     * @return mixed
     */
    function env(string $name = null, $default = null)
    {
        return App::getEnv($name, $default);
    }
}

if (!function_exists('lang')) {
    /**
     * 语言包
     * @param string $name
     * @return array|mixed|string|string[]
     */
    function lang(string $name)
    {
        $name = strtolower($name);
        $name_arr = explode('.', $name);

        $app = new App();
        $appPath = $app->getAppPath() . '/lang/';
        if (!is_dir($appPath)) {
            @mkdir($appPath, 0777, true);
        }
        $path = $appPath . $name_arr[0] . '.php';
        Lang::load($path);

        $n = count($name_arr);
        switch ($n) {
            case 1:
                return Lang::get();
            case 2:
                return Lang::get($name_arr[1]);
            case 3:
                $arr = Lang::get($name_arr[1]);
                return $arr[$name_arr[2]] ?? '';
            default:
                return '';
        }
    }
}

if (!function_exists('runningInConsole')) {
    /**
     * 是否运行在命令行下
     * @return bool
     */
    function runningInConsole(): bool
    {
        return php_sapi_name() === 'cli' || php_sapi_name() === 'phpdbg';
    }
}